gusucode.com > 先进 PID 控制及其 MATLAB 仿真 (程序) > 先进 PID 控制及其 MATLAB 仿真 (程序)\CHAPTER7\chap7_7_1.m
%Zero Phase Error Frequency testing clear all; close all; ts=0.001; sys=tf(5.235e005,[1,87.35,1.047e004,0]); dsys=c2d(sys,ts,'z'); [num,den]=tfdata(dsys,'v'); kp=0.70; error_1=0; kk=0; %Frequency steps for F=0.5:0.5:8 kk=kk+1; FF(kk)=F; u_1=0.0;u_2=0.0;u_3=0.0; y_1=0;y_2=0;y_3=0; for k=1:1:2000 time(k)=k*ts; %Tracing Sine high frequency Signal rin(k)=0.5*sin(1*2*pi*F*k*ts); %Linear model yout(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(2)*u_1+num(3)*u_2+num(4)*u_3; error(k)=rin(k)-yout(k); u(k)=kp*error(k); %P Controller %------------Return of PID parameters-------------% u_3=u_2;u_2=u_1;u_1=u(k); y_3=y_2;y_2=y_1;y_1=yout(k); end plot(time,rin,'r',time,yout,'b'); pause(0.0000000000001); Y=rin(1001:1:2000)'; for i=1:1:1000 fai(1,i) = sin(2*pi*F*i*ts); fai(2,i) = cos(2*pi*F*i*ts); end c = inv(fai*fai')*fai*Y; pinA = sqrt(c(1)*c(1)+c(2)*c(2)); pinF = atan(c(2)/c(1)); Y=yout(1001:1:2000)'; for i=1:1:1000 fai(1,i) = sin(2*pi*F*i*ts); fai(2,i) = cos(2*pi*F*i*ts); end c=inv(fai*fai')*fai*Y; poutA = sqrt(c(1)*c(1)+c(2)*c(2)); poutF = atan(c(2)/c(1)); mag(kk)=20*log10(poutA/pinA); %Magnitude ph(kk)=(poutF-pinF)*180/pi; %Phase error end FF=FF' mag=mag' ph=ph' save freq.mat FF mag ph; save closed.mat kp;